package org.example.leetCode;

import java.lang.reflect.Proxy;

/**
 * @author Vader
 * @date 2022/3/4
 **/

public class proxy {
    public static void main(String[] arges) throws Exception {
        IA ia = (IA) createObject(IA.class.getName() + "$getName = Abc");
        System.out.println(ia.getName()); //输出Abc
        ia = (IA) createObject(IA.class.getName() + "$getName = Bcd");
        System.out.println(ia.getName()); //输出Bcd
    }

    public static Object createObject(String str) throws Exception {
        String className = str.substring(0, str.indexOf("$"));
        String method = str.substring(str.indexOf("$") + 1, str.indexOf("=")).trim();
        String result = str.substring(str.indexOf("=") + 1);

        return Proxy.newProxyInstance(Class.forName(className).getClassLoader(), new Class[]{Class.forName(className)},
                ((proxy, method1, args) -> {
                    if (method1.getName().equals(method)) {
                        return result;
                    } else {
                        throw new Exception();
                    }
                }));

    }
}
//    //请实现方法createObject
//    public static Object createObject(String str) throws Exception {
//
//        String className = str.substring(0, str.lastIndexOf("$"));
//        String methodName = str.substring(str.lastIndexOf("$") + 1, str.lastIndexOf("=")).trim();
//        String value = str.substring(str.indexOf("=") + 1).trim();
//        return Proxy.newProxyInstance(Class.forName(className).getClassLoader(), new Class[]{Class.forName(className)},
//                ((proxy, method, args) -> {
//                    if (method.getName().equals(methodName)) {
//                        return value;
//                    } else {
//                        throw new UnsupportedOperationException("Unsupported method:" + method.getName());
//                    }
//                }));
//    }

interface IA {
    String getName();
}